from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys  # 导入键盘类
from selenium.common.exceptions import NoSuchElementException

"""
browser = webdriver.Chrome()
browser.get("https://www.baidu.com/")
time.sleep(2)

browser.maximize_window()
time.sleep(1)

browser.find_element_by_id("kw").send_keys("软件测试")
time.sleep(2)

browser.find_element_by_id("su").click()
time.sleep(2)
print(type(browser))
"""


class Testcase(object):
    def __init__(self):
        self.browser = webdriver.Chrome()
        self.browser.get("https://www.baidu.com/")
        time.sleep(1)
        self.browser.maximize_window()
        time.sleep(1)
        self.browser.implicitly_wait(5)  # 设置隐式等待时间

    def test_id(self):
        self.browser.find_element_by_id('kw').send_keys("冬至吃什么")
        time.sleep(1)
        self.browser.find_element_by_id('su').click()  # class和css方法调试了两三次都没能成功，有时间再试着练练
        time.sleep(1)
        self.browser.find_element_by_xpath('//*[@id="2"]/h3/a').click()  # find_element_by_xpath
        time.sleep(1)
        # self.browser.close()                # 为啥使用close方法它会将网页一个一个关闭，且第一个关闭的是前一个网页，而不是最近刚打开的这个

        # self.browser.quit()
        # 1 > close方法是，关闭当前窗口，这个当前，如何理解，就是driver实例操作的页面，叫当前。如果当前窗口只有一个tab，那么这个close方法就相当于关闭了浏览器。
        # 2 > quit方法就是直接退出并关闭所有关联的tab窗口。所以，close方法一般关闭一个tab，quit方法才是我们认为的完全关闭浏览器方法

    def test_css(self):
        self.browser.find_element_by_id("kw").send_keys("冬至吃什么")
        time.sleep(1)
        self.browser.find_element_by_css_selector(".s_ipt").clear()  # css定位class元素时给内容前加上小数点.
        time.sleep(1)
        self.browser.find_element_by_css_selector("#kw").send_keys("南方吃汤圆，北方吃饺子")  # css定位ID元素时给内容前加上#号
        time.sleep(1)
        self.browser.find_element_by_css_selector("span>input").clear()  # css定位通过层级关系相对路径进行定位用大于号>
        time.sleep(1)
        self.browser.find_element_by_css_selector("form.fm>span>input#kw").send_keys("组合定位")
        time.sleep(1)
        self.browser.quit()

    def test_name(self):
        self.browser.find_element_by_name('wd').send_keys('斯人若彩虹，遇上方知有')
        time.sleep(1)
        self.browser.find_element_by_class_name('bg').click()  # find_element_by_class_name
        time.sleep(1)

        # self.browser.find_element_by_link_text('百度首页').click()        # find_element_by_link_text()
        # time.sleep(2)

    def test_partial_link_text(self):
        self.test_name()
        time.sleep(2)
        self.browser.find_element_by_partial_link_text('首页').click()  # find_element_by_partial_link_text
        time.sleep(1)
        self.browser.find_element_by_xpath('//input[@id="kw"]').send_keys("西红柿蛋花汤")  # xpath相对路径
        time.sleep(1)
        self.browser.close()

    def test_all(self):
        self.browser.find_element(By.NAME, value='wd').send_keys('今天是星期三')
        time.sleep(1)
        self.browser.find_element(By.CLASS_NAME, value='bg').click()
        self.browser.find_element(By.CSS_SELECTOR, value='.s_ipt').clear()
        time.sleep(1)
        self.browser.find_element(By.TAG_NAME, value='form>span>input').send_keys('明天是星期四')  # 使用单一路径未能成功
        self.browser.find_element(By.LINK_TEXT, value='百度首页').click()
        self.browser.find_element(By.ID, value='kw').send_keys('后天就是元旦')
        time.sleep(1)
        self.browser.find_element(By.PARTIAL_LINK_TEXT, value='首页').click()
        time.sleep(2)
        self.browser.quit()

    def test_tag(self):
        input = self.browser.find_element_by_tag_name("input")  # find_element_by_tag_name
        print(input)

        time.sleep(1)

        self.browser.close()

    def test_implicitly(self):  # 隐式等待
        try:
            print(time.ctime())
            # #如果找到元素，执行时间是不受限制的，不会影响脚本的执行速度
            # self.driver.find_element_by_id("").send_keys("")
            # 如果没有找到元素，会按照最大等待时间执行
            self.browser.find_element_by_id("kw").send_keys("今天是什么日子")
            time.sleep(2)
            self.browser.find_element_by_id("su").click()
        except NoSuchElementException as e:
            print(e)
        finally:
            print(time.ctime())

    def test_key(self):  # 模拟键盘操作
        self.browser.find_element_by_id("kw").send_keys("今晚就是平安夜了")
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys(Keys.BACK_SPACE * 8)
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys(Keys.SPACE * 3)
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys("明天就是圣诞节了")
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "A")
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "X")
        time.sleep(2)
        self.browser.find_element_by_id("kw").send_keys(Keys.CONTROL, "V")
        time.sleep(1)
        self.browser.find_element_by_id("kw").send_keys(Keys.ENTER)
        time.sleep(1)


if __name__ == '__main__':
    # Testcase()
    # Testcase().test_id()
    # Testcase().test_name()
    # Testcase().test_partial_link_text()
    # Testcase().test_tag()
    # Testcase().test_implicitly()
    # Testcase().test_css()
    Testcase().test_all()
    # Testcase().test_key()
